在前幾週,我談論了很多有關Nutanix Calm DSL的內容。 與此相關的是,發布了Calm DSL的各種“主頁” – Nutanix.dev上與該主題相關的所有文章的集合。
但是,今天,我們正在尋找完全不同的東西。 固然DSL確實在幕後大量使用了Nutanix API,但本文將著眼於每個自動化工作流程中可能包含的部分-創建VM。 但是為什麼呢? 我們以前沒有談論過嗎? 是的,但是今天的示例會稍有不同–我們將使用Cloud-Init自定義該VM。
如果您不熟悉Cloud-Init,可以將其視為Windows Sysprep的大致等同形式,即可以在創建過程中創建和自定義Linux VM。
儘管在使用Nutanix v3 API創建虛擬機的基礎上還有其他現有材料,但我將再次快速進行介紹。 希望這將有助於社區入門並在一篇文章中全部使用Cloud-Init。
首先,在下面查看Nutanix v3 API POST請求和JSON有效負載–它會創建僅具有必需參數的基本VM。
https://:9440/api/nutanix/v3/vms
與此請求一起,我們需要發送一個JSON負載,該負載指定創建VM時所需的必需參數。
{
"spec": {
"name": "vm_from_v3_api",
"resources": {}
},
"metadata": {
"kind": "vm"
}
}
該請求的重點如下:
暫時無需執行此請求-我們將擴展這個想法,並創建一個更有用的VM。
在現實世界中,如果不指定任何規格,創建VM可能並不過分有用。通常,VM將需要執行某種任務,無論是Web服務器,數據庫服務器,還是目前無法想像的任何數量的任務。每種類型的服務器都可能會根據其功能製定某種推薦規格-現在讓我們看看如何實現。
首先,Nutanix v3 API端點與上面使用的端點完全相同-在最簡單的級別上,我們仍在做相同的事情,即發送API POST請求以創建新的VM。
https://:9440/api/nutanix/v3/vms
但是,其他區別立即開始–與該請求一起發送的JSON有效負載比我們以前使用的要詳細得多。
{
"spec":{
"name":"{{vm_name}}",
"resources":{
"power_state":"ON",
"num_vcpus_per_socket":1,
"num_sockets":1,
"memory_size_mib":1024,
"disk_list":[{
"device_properties":{
"device_type":"DISK",
"disk_address": {
"device_index": 0,
"adapter_type": "SCSI"
}
},
"data_source_reference": {
"kind": "image",
"uuid": "{{cloud_init_image_uuid_pc}}"
}
},
{
"device_properties":{
"device_type":"CDROM"
}
}],
"nic_list":[{
"nic_type":"NORMAL_NIC",
"is_connected":true,
"ip_endpoint_list":[{
"ip_type":"DHCP"
}],
"subnet_reference":{
"kind":"subnet",
"name":"{{subnet_name}}",
"uuid":"{{subnet_uuid}}"
}
}],
"guest_tools":{
"nutanix_guest_tools":{
"state":"ENABLED",
"iso_mount_state":"MOUNTED"
}
}
},
"cluster_reference":{
"kind":"cluster",
"name":"{{cluster_name}}",
"uuid":"{{cluster_uuid}}"
}
},
"api_version":"3.1.0",
"metadata":{
"kind":"vm"
}
}
以下是此請求的重點-請用與您的環境匹配的值替換{{placeholder}}變量。
現在發送此請求將導致VM符合我們上面的規範。
至此,我們已經使用“外殼”方法(最小參數)和詳細方法(擴展的虛擬機規格)創建了虛擬機。 我們還沒有做的是使用Cloud-Init定制功能創建VM。 現在開始吧。
在生成請求之前,這是我們將用於請求的Cloud-Init YAML數據。
#cloud-config
users:
- name: nutanix
ssh-authorized-keys:
- ssh-rsa KEY
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
shell: /bin/bash
packages:
- httpd
上面的Cloud-Init用戶數據執行以下任務:
請注意,SSH密鑰已被刪除並替換為“ ssh-rsa KEY”。 如果您打算按原樣使用此有效負載,則需要用SSH公鑰替換“ ssh-rsa KEY”。
值得注意的是,對於以下任何POST請求,API端點仍不會更改:
https://:9440/api/nutanix/v3/vms
再次更改的是隨請求發送的JSON有效負載。 下面的有效負載與上一個請求中的有效負載相同,但增加了Cloud-Init來賓定制數據。
這是現在完整的JSON有效負載,包括來賓定制數據。
{
"spec":{
"name":"{{vm_name}}",
"resources":{
"power_state":"ON",
"num_vcpus_per_socket":1,
"num_sockets":1,
"memory_size_mib":1024,
"disk_list":[{
"device_properties":{
"device_type":"DISK",
"disk_address": {
"device_index": 0,
"adapter_type": "SCSI"
}
},
"data_source_reference": {
"kind": "image",
"uuid": "{{cloud_init_image_uuid_pc}}"
}
},
{
"device_properties":{
"device_type":"CDROM"
}
}],
"nic_list":[{
"nic_type":"NORMAL_NIC",
"is_connected":true,
"ip_endpoint_list":[{
"ip_type":"DHCP"
}],
"subnet_reference":{
"kind":"subnet",
"name":"{{subnet_name}}",
"uuid":"{{subnet_uuid}}"
}
}],
"guest_tools":{
"nutanix_guest_tools":{
"state":"ENABLED",
"iso_mount_state":"MOUNTED"
}
},
"guest_customization": {
"cloud_init": {
"user_data": "I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IG51dGFuaXgKICAgIHNzaC1hdXRob3JpemVkLWtleXM6CiAgICAgIC0gc3NoLXJzYSBLRVkKICAgIHN1ZG86IFsnQUxMPShBTEwpIE5PUEFTU1dEOkFMTCddCiAgICBncm91cHM6IHN1ZG8KICAgIHNoZWxsOiAvYmluL2Jhc2gKCnBhY2thZ2VzOgogIC0gaHR0cGQ="
},
"is_overridable": false
}
},
"cluster_reference":{
"kind":"cluster",
"name":"{{cluster_name}}",
"uuid":"{{cluster_uuid}}"
}
},
"api_version":"3.1.0",
"metadata":{
"kind":"vm"
}
}
完成API請求,有效負載和客戶定制數據後,我們可以發送請求。 單獨創建VM的請求並不是很有趣,因此,我們將在啟動VM時對其進行研究。 查看AHV VM控制台,以下是這些要點:
以下屏幕截圖顯示了VM引導和Cloud-Init運行:
使用API v3創建並使用Cloud-Init配置的VM
閱讀本文的同時,我們完成了以下步驟:
使用這些方法,可以看到如何將Nutanix v3 API不僅用於創建VM,還可使用於行業認可的方法(例如Cloud-Init用於Linux VM定制)。
感謝您的閱讀,祝您有美好的一天!